| Предыдущая | Следущая | |
Flash Player 6. В классах ActionScript 2.0, вместо этого метода можно использовать get или set .
myObject.addProperty(prop:String,getFunc:Function,setFunc:Function): Boolean
prop Строка; имя создаваемого свойства объекта.
getFunc Функция, которая вызывается для возвращения
значения свойства; этот параметр является объектом класса Function
.
setFunc Функция, которая вызывается для установки
значения свойства;
этот параметр является объектом класса Function.
Если Вы передаете в качестве этого параметра null,
свойство будет только для чтения ( read-only).
Булево значение: true если свойство создано успешно; false в
противном случае.
Метод; создает геттер/сеттер свойство (getter/setter - получатель/установщик).
Когда Flash читает геттер/сеттер свойство, вызывается функция getFunc,
а возвращаемое ею значение становится значением свойства prop .
Когда Flash записывает геттер/сеттер свойство, вызывается setFun и
передается ей новое значение параметра. Если свойство с указанным именем уже
существует, новое свойство перезапишет его.
“get”-функция не имеет параметров. Возвращаемое ею значение может быть любого типа, который может изменяться между вызовами. Возвращаемое значение принимается как текущее значение свойства.
“set”-функция имеет один параметр - новое значение свойства. Например, если
свойство x присваивается выражением x = 1, в set-функцию
будет передан параметр 1 числового типа. Возвращаемое значение set-функции
игнорируется.
Можно добавить геттер/сеттер свойство в прототип объекта. В этом случае все экземпляры объекта наследующие прототип объекта, унаследуют и это свойство. Это делает возможным добавить геттер/сеттер свойство только в одном месте и распространить его на все экземпляры класса (похоже на добавление методов прототипу объекта). Если get/set функция вызывается для геттер/сеттер свойства в унаследовавшем прототип объекте, ссылка переданная get/set функции будет ссылкой самого объекта, а не прототипа.
В случае некорректного вызова, Object.addProperty() может завершиться
ошибкой. Следующая таблица описывает ошибки, которые могут иметь место:
|
Статус ошибки |
Что происходит |
|---|---|
|
|
возвращается |
|
|
возвращается |
|
|
возвращается |
В следующем примере, оъект имеет два внутренних метода, setQuantity() и getQuantity().
Свойство, bookcount, может быть использовано для вызова этих методов
когда оно либо устанавливается, дибо считывается. Третий внутренний метод, getTitle(),
возвращает значение, которое связано с read-only свойством bookname.
Там где код считывает значение myBook.bookcount,
ActionScript интерпритатор автоматически вызывает myBook.getQuantity().
Там где код изменяет значение myBook.bookcount,
интерпритатор вызывает myObject.setQuantity().
Для Свойства bookname set функция не определяется,
поэтому все попытки изменить bookname игнорируются.
function Book() {
this.setQuantity = function(numBooks:Number):Void {
this.books = numBooks;
};
this.getQuantity = function():Number {
return this.books;
};
this.getTitle = function():String {
return "Catcher in the Rye";
};
this.addProperty("bookcount", this.getQuantity, this.setQuantity);
this.addProperty("bookname", this.getTitle, null);
}
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
// output: You ordered 5 copies of Catcher in the Rye
Предыдущий пример работает, однако свойства bookcount и bookname добавляются
для каждого экземпляра объекта Book,
что требует наличия двух свойств для каждого экземпляра объекта. Существование
в классе большого количества свойств, таких как bookcount и bookname,
отнимает существенную часть памяти.
Вместо этого, можно поместить свойства в Book.prototype,
так, чтобы свойства bookcount и bookname существовали
только в одном месте. Результат, тем не менее, будет таким же как в примере,
который добавляет bookcount и bookname непосредственно
каждому экземпляру. При попытке обратиться к любому из свойств экземпляра
класса Book , отсутствие свойства заставит подниматься по цепочке прототипов
до тех
пор пока не будет найден варант, определенный в Book.prototype.
Следующий пример показывает как добавить свойства к Book.prototype:
function Book() {}
Book.prototype.setQuantity = function(numBooks:Number):Void {
this.books = numBooks;
};
Book.prototype.getQuantity = function():Number {
return this.books;
};
Book.prototype.getTitle = function():String {
return "Catcher in the Rye";
};
Book.prototype.addProperty("bookcount", Book.prototype.getQuantity, Book.prototype.setQuantity);
Book.prototype.addProperty("bookname", Book.prototype.getTitle, null);
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
Следующий пример показывает как использовать неявные геттер и сеттер
функции, доступные в ActionScript 2.0. Подробнее см. "Скрытые геттер/сеттер методы". Еще
правильнее, чем определять функцию Book и редактировать Book.prototype, будет
определить класс Book во внешнем файле с именем Book.as. Подробнее
см. "Создание и использование классов". Следующий
код должен быть размещен в отдельном внешнем файле с именем Book.as , который
содержит толко определние класса и находится в отведенной для этих файлов
директории:
class Book {
var books:Number;
function set bookcount(numBooks:Number):Void {
this.books = numBooks;
}
function get bookcount():Number {
return this.books;
}
function get bookname():String {
return "Catcher in the Rye";
}
}
Следующий код может быть размещен во FLA файле и будет работать также как и предыдущиие примеры:
var myBook:Book = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
| Посмотреть комментарии LiveDocs | Предыдущая | Следущая | |